<test>
    <create_query>
        CREATE TABLE simple_key_hashed_array_dictionary_source_table
        (
            id UInt64,
            value_int UInt64,
            value_string String,
            value_decimal Decimal64(8),
            value_string_nullable Nullable(String)
        ) ENGINE = Memory;
    </create_query>

    <create_query>
        CREATE TABLE complex_key_hashed_array_dictionary_source_table
        (
            id UInt64,
            id_key String,
            value_int UInt64,
            value_string String,
            value_decimal Decimal64(8),
            value_string_nullable Nullable(String)
        ) ENGINE = Memory;
    </create_query>

    <create_query>
        CREATE DICTIONARY simple_key_hashed_array_dictionary
        (
            id UInt64,
            value_int UInt64,
            value_string String,
            value_decimal Decimal64(8),
            value_string_nullable Nullable(String)
        )
        PRIMARY KEY id
        SOURCE(CLICKHOUSE(DB 'default' TABLE 'simple_key_hashed_array_dictionary_source_table'))
        LAYOUT(HASHED_ARRAY())
        LIFETIME(MIN 0 MAX 1000);
    </create_query>

    <create_query>
        CREATE DICTIONARY complex_key_hashed_array_dictionary
        (
            id UInt64,
            id_key String,
            value_int UInt64,
            value_string String,
            value_decimal Decimal64(8),
            value_string_nullable Nullable(String)
        )
        PRIMARY KEY id, id_key
        SOURCE(CLICKHOUSE(DB 'default' TABLE 'complex_key_hashed_array_dictionary_source_table'))
        LAYOUT(COMPLEX_KEY_HASHED_ARRAY())
        LIFETIME(MIN 0 MAX 1000);
    </create_query>

    <fill_query>
        INSERT INTO simple_key_hashed_array_dictionary_source_table
        SELECT number, number, toString(number), toDecimal64(number, 8), toString(number)
        FROM system.numbers
        LIMIT 5000000;
    </fill_query>

    <fill_query>
        INSERT INTO complex_key_hashed_array_dictionary_source_table
        SELECT number, toString(number), number, toString(number), toDecimal64(number, 8), toString(number)
        FROM system.numbers
        LIMIT 5000000;
    </fill_query>

    <substitutions>
        <substitution>
            <name>column_name</name>
            <values>
                <value>'value_int'</value>
                <value>'value_string'</value>
                <value>'value_decimal'</value>
                <value>'value_string_nullable'</value>
            </values>
        </substitution>

        <substitution>
            <name>elements_count</name>
            <values>
                <value>500000</value>
                <value>750000</value>
            </values>
        </substitution>
    </substitutions>

    <query>
        WITH rand64() % toUInt64({elements_count}) as key
        SELECT dictGet('default.simple_key_hashed_array_dictionary', {column_name}, key)
        FROM system.numbers
        LIMIT {elements_count}
        FORMAT Null;
    </query>

    <query>
        WITH rand64() % toUInt64({elements_count}) as key
        SELECT dictHas('default.simple_key_hashed_array_dictionary', key)
        FROM system.numbers
        LIMIT {elements_count}
        FORMAT Null;
    </query>

    <query>
        SELECT * FROM simple_key_hashed_array_dictionary
        FORMAT Null;
    </query>

    <query>
        WITH (rand64() % toUInt64({elements_count}), toString(rand64() % toUInt64({elements_count}))) as key
        SELECT dictGet('default.complex_key_hashed_array_dictionary', {column_name}, key)
        FROM system.numbers
        LIMIT {elements_count}
        FORMAT Null;
    </query>

    <query>
        WITH (rand64() % toUInt64({elements_count}), toString(rand64() % toUInt64({elements_count}))) as key
        SELECT dictHas('default.complex_key_hashed_array_dictionary', key)
        FROM system.numbers
        LIMIT {elements_count}
        FORMAT Null;
    </query>

    <query>
        SELECT * FROM complex_key_hashed_array_dictionary
        FORMAT Null;
    </query>

    <drop_query>DROP DICTIONARY IF EXISTS simple_key_hashed_array_dictionary;</drop_query>
    <drop_query>DROP DICTIONARY IF EXISTS complex_key_hashed_array_dictionary;</drop_query>

    <drop_query>DROP TABLE IF EXISTS simple_key_hashed_array_dictionary_source_table;</drop_query>
    <drop_query>DROP TABLE IF EXISTS complex_key_hashed_array_dictionary_source_table;</drop_query>
</test>
